pub fn main() {
    let x = plus_or_minus(10);
    println!("x is {}", x);
    dead_end();
    // forever();
}

fn plus_or_minus(x: i32) -> i32 {
    if x > 5 {
        return x - 5
    };
    x + 5
}

// ()  ->  表示一个单元类型

// 泛型函数 可以接受任何类型 该函数隐式返回一个 ()
fn report<T: std::fmt::Debug>(item: T) {
    println!("{:?}", item);
}

// 泛型函数 可以接受任何类型 该函数显式返回一个 ()
fn clear(text: &mut String) -> () {
    *text = String::from("");
}

// 永不返回的 发散函数 !
// 当用 ! 作函数返回类型的时候，表示该函数永不返回( diverge function )，特别的，这种语法往往用做会导致程序崩溃的函数：
fn dead_end() -> ! {
    panic!("你已经到了穷途末路，崩溃吧！");
}

// 下面的函数创建了一个无限循环，该循环永不跳出，因此函数也永不返回：
fn forever() -> ! {
    loop {
        println!("我将永远存活！");
    }
}


fn get_option(tp: u8) -> Option<i32> {
    match tp {
        1 => {
            // TODO
        }
        _ => {
            // TODO
        }
    };

    never_return_fn()
}


fn never_return_fn() -> ! {
    /// | 方式                 | 是否触发 panic | 是否崩溃退出 | 是否消耗 CPU | 典型用途         | 行为                                  | 特点                                                                     |
    /// |--------------------|------------|--------|----------|--------------|-------------------------------------|------------------------------------------------------------------------|
    /// | `unimplemented!()` | ✔️         | ✔️     | ❌        | 标记未实现代码      | 触发 panic 并明确提示"not yet implemented" | 带有语义化提示，编译时会给出更明确的错误信息                                                 |
    /// | `panic!()`         | ✔️         | ✔️     | ❌        | 主动终止程序       | 触发 panic 但没有错误信息                    | 可以携带自定义错误信息（推荐使用 `panic!("message")`）；空 panic 会输出默认信息 `explicit panic` |
    /// | `todo!()`          | ✔️         | ✔️     | ❌        | 标记待办事项       | 与 unimplemented!() 完全等价             | 强调这是**待办事项**（语义差异）；某些 IDE 会特别高亮 `todo!()` 提示                           |
    /// | 无限循环               | ❌          | ❌      | ✔️       | 需要长期运行不返回的场景 | 真正意义上的永不返回（不触发 panic）               | 函数会永久阻塞当前线程；不会导致程序崩溃                                                   |

    // 编译时会报错：not yet implemented
    unimplemented!();

    // 空 panic
    panic!();

    // 编译时会报错：not yet implemented
    todo!();

    // 无限循环
    loop {
        std::thread::sleep(std::time::Duration::from_secs(1))
    }
}